﻿
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<!-- saved from url=(0014)about:internet -->
<html xmlns:msxsl="urn:schemas-microsoft-com:xslt" xmlns:mssdk="winsdk" xmlns:script="urn:script" xmlns:build="urn:build" xmlns:MSHelp="http://msdn.microsoft.com/mshelp">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<meta name="Description" content="Expression Examples"/>
<meta name="MSHAttr" content="PreferredSiteName:MSDN"/>
<meta name="MSHAttr" content="PreferredLib:/library/windows/hardware"/>
<title>Expression Examples</title>

<meta name="MS-HAID" content="r13_syntax_7538f485-e4d2-4edc-8290-314527cbb37d.xml"/>


<link rel="STYLESHEET" type="text/css" HREF="../common/backsdk4.css"/>





<style>
html,div { margin: 0; padding: 0;}

body {
	padding: 0px;
	margin: 0px;
	overflow: auto;
	height: 100%;
}

#winchm_template_button{
	float: right;
	width: 93px;
	top: 7px;
	position: relative;
	text-align: right;
	right: 5px;
	height: auto;
}

#winchm_template_top{
	padding: 0px;
	margin: 0px;
	border-bottom: 1px solid #9B9B9B;
	background-color: #B1CEFE;
}

#winchm_template_navigation{
	margin: 0px;
	padding-top: 7px;
	padding-left: 7px;
	padding-bottom: 3px;
	padding-right: 0px;
	font-size: 8.5pt;
	font-family: Arial, Helvetica, sans-serif;
	font-weight: normal;
	color: #585858;
}

#winchm_template_title{
	margin: 0px;
	padding-top: 4px;
	padding-left: 7px;
	padding-bottom: 7px;
	padding-right: 0px;
	font-size: 18px; 
	font-family: Verdana, Geneva, sans-serif;
	color: #363636;
}

#winchm_template_content{
	margin-top: 20px;
	margin-left: 15px;
	margin-bottom: 20px;
	margin-right: 15px;
	width: auto  !important;
	width: 100%;
}

#winchm_template_footer{
	border-width: 1px;
	border-color: #B1CEFE;
	border-top-style: solid;
	margin-top: 15px;
	margin-left: 15px;
	margin-bottom: 20px;
	margin-right: 15px;
	padding-top: 7px;
	padding-left: 0px;
	padding-bottom: 0px;
	padding-right: 0px;
	font-family: arial, helvetica, sans-serif;
	font-size: 8.5pt;
	color: #696969;
	width: auto;
	text-align: left;
}


#winchm_template_container{
	margin: 0px;
	padding: 0px;
	position: static;
	padding-bottom: 3px;
	overflow: auto;
	background-color: #FFFFFF;
}


@media print
{
#winchm_template_container{
	position: static;	
	margin: 0px;
	padding: 5px;
	
	width: auto;
	height: auto;
	overflow: auto;
}
#winchm_template_button{
visibility:hidden;
}
}

#winchm_template_navigation A:link	{text-decoration: none; color:#004080}
#winchm_template_navigation A:visited  {text-decoration: none; color: #004080}
#winchm_template_navigation A:active {text-decoration: none; color: #004080 }
#winchm_template_navigation A:hover {text-decoration: none;color: #0080FF}

A:link	{text-decoration: underline; color:#0033CC}
A:visited  {text-decoration: underline; color: #0033CC}
A:active {text-decoration: underline; color: #0033CC }
A:hover {text-decoration: underline;color: #FF0000;}
</style>
<script type="text/javascript">
function isMobile(){
Agent = window.navigator.userAgent;
if (Agent.indexOf("iPhone")>=1 || Agent.indexOf("iPad")>=1 || Agent.indexOf("iPod")>=1 || Agent.indexOf("Android")>=1){
return true;
}else{
return false;	
}

}
function d_onresize(){
if (window.navigator.userAgent.indexOf("MSIE")>=1){
document.getElementById('winchm_template_container').style.pixelWidth = document.body.offsetWidth - 3;
document.getElementById('winchm_template_container').style.pixelHeight = document.body.offsetHeight - document.getElementById('winchm_template_top').offsetHeight - 4;
}
document.getElementById('winchm_template_container').style.top = document.getElementById('winchm_template_top').offsetHeight + 'px';
}

function d_onbeforeprint(){
document.getElementById('winchm_template_container').style.width = 'auto';
document.getElementById('winchm_template_container').style.height = 'auto';
}

function d_onafterprint(){
d_onresize();
}

if(!isMobile()){

window.onload = d_onresize;
window.onresize = d_onresize;
window.onbeforeprint = d_onbeforeprint;
window.onafterprint = d_onafterprint;

document.write("<style>\n");
document.write("body {overflow: hidden;}\n");
document.write("#winchm_template_container {position: absolute;overflow: auto;top : 0px;right: 0px;bottom: 0px;left: 0px;}\n");
document.write("</style>\n");
}

</script>
</head>
<body><script language="JavaScript" type="text/JavaScript">
function syn(){
if(parent.nav.tree){
 if(parent.nav.tree.loaded){
  parent.nav.tree.selectNode(1921);
 }else{
  setTimeout("syn()",500);
}
  }else{
  setTimeout("syn()",500);
  }}
if(parent!=self){
  setTimeout("syn()",100);
}else{
  parent.location.href = "../../index.htm?page=debugger/expression_examples.htm";
}
originalOnload = window.onload;
if(originalOnload==null){
window.onload = function(){parent.contentLoaded = true;};
}else{
window.onload = function(){originalOnload();parent.contentLoaded = true;};
}
</script> 


<div id="winchm_template_top">
	<div id="winchm_template_button"><A href="masm_expressions_vs__c___expressions.htm" title="Previous topic"><img id="winchm_template_prev" alt="Previous topic" src="../template2/btn_prev_n.gif" border="0"></a><A href="sign_extension.htm" title="Next topic"><img id="winchm_template_next" alt="Next topic" src="../template2/btn_next_n.gif" border="0"></a></div>
	<div id="winchm_template_navigation">Help &gt; 
<A href="introduction6.htm">Debugging Tools for Windows (WinDbg, KD, CDB, NTSD)</A> &gt; <A href="debugger_reference.htm">Debugger Reference</A> &gt; <A href="debugger_commands.htm">Debugger Commands</A> &gt; <A href="syntax_rules.htm">Syntax Rules</A> &gt; <A href="numerical_expression_syntax.htm">Numerical Expression Syntax</A> &gt; </div>
	<div id="winchm_template_title">Expression Examples</div>
</div>
<div id="winchm_template_container">
	<div id="winchm_template_content"><div id="mainSection"><p>This topics contains examples of MASM and C++ expressions that are used in various commands.</p>
<p>All other sections of this Help documentation use MASM expression syntax in the examples (unless otherwise noted). C++ expression syntax is very useful for manipulating structures and variables, but it does not parse the parameters of debugger commands very well. </p>
<p>If you are using debugger commands for general purposes or using debugger extensions, you should set MASM expression syntax as the default syntax. If you must have a specific parameter to use C++ expression syntax, use the <b>@@( )</b> syntax.</p>
<h3><a id="conditional_breakpoints"></a><a id="CONDITIONAL_BREAKPOINTS"></a>Conditional Breakpoints</h3>
<p>You can use comparison operators to create <a href="#Bookmark1358">conditional breakpoints</a>.  The following code example uses MASM expression syntax. Because the current default radix is 16, the example uses the <b>0n</b> prefix so that the number 20 is understood as a decimal number.</p>
<div class="code"><span codelanguage=""><table>
<tr>
<th></th>
</tr>
<tr>
<td>
<pre>0:000&gt; bp MyFunction+0x43 "j ( poi(MyVar)&gt;0n20 ) ''; 'gc' " </pre>
</td>
</tr>
</table></span></div>
<p>In the previous example, <b>MyVar</b> is an integer in the C source. Because the MASM parser treats all symbols as addresses, the example must have the <b>poi</b> operator to dereference <b>MyVar</b>.</p>
<h3><a id="conditional_expressions"></a><a id="CONDITIONAL_EXPRESSIONS"></a>Conditional Expressions</h3>
<p>The following example prints the value of <b>ecx</b> if <b>eax</b> is greater than <b>ebx</b>, 7 if <b>eax</b> is less than <b>ebx</b>, and 3 if <b>eax</b> equals <b>ebx</b>. This example uses the MASM expression evaluator, so the equal sign (=) is a comparison operator, not an assignment operator.</p>
<div class="code"><span codelanguage=""><table>
<tr>
<th></th>
</tr>
<tr>
<td>
<pre>0:000&gt; ? ecx*(eax&gt;ebx) + 7*(eax&lt;ebx) + 3*(eax=ebx) </pre>
</td>
</tr>
</table></span></div>
<p>In C++ syntax, the <b>@</b> sign indicates a register, a double equal sign (==) is the comparison operator, and code must explicitly cast from BOOL to <b>int</b>. Therefore, in C++ syntax, the previous command becomes the following.</p>
<div class="code"><span codelanguage=""><table>
<tr>
<th></th>
</tr>
<tr>
<td>
<pre>0:000&gt; ?? @ecx*(int)(@eax&gt;@ebx) + 7*(int)(@eax&lt;@ebx) + 3*(int)(@eax==@ebx) </pre>
</td>
</tr>
</table></span></div>
<h3><a id="c___expression_examples"></a><a id="C___EXPRESSION_EXAMPLES"></a>C++ Expression Examples</h3>
<p>If <b>myInt</b> is a ULONG32 value and if you are using the MASM expression evaluator, the following two examples show the value of <b>MyInt</b>.</p>
<div class="code"><span codelanguage=""><table>
<tr>
<th></th>
</tr>
<tr>
<td>
<pre>0:000&gt; ?? myInt 
0:000&gt; dd myInt L1 </pre>
</td>
</tr>
</table></span></div>
<p>However, the following example shows the <i>address</i> of <b>myInt</b>.</p>
<div class="code"><span codelanguage=""><table>
<tr>
<th></th>
</tr>
<tr>
<td>
<pre>0:000&gt; ? myInt </pre>
</td>
</tr>
</table></span></div>
<h3><a id="mixed_expression_examples"></a><a id="MIXED_EXPRESSION_EXAMPLES"></a>Mixed Expression Examples</h3>
<p>You cannot use source-line expressions in a C++ expression. The following example uses the <b>@@( )</b> syntax to nest an MASM expression within a C++ expression. This example sets <b>MyPtr</b> equal to the address of line 43 of the Myfile.c file.</p>
<div class="code"><span codelanguage=""><table>
<tr>
<th></th>
</tr>
<tr>
<td>
<pre>0:000&gt; ?? MyPtr = @@( `myfile.c:43` )</pre>
</td>
</tr>
</table></span></div>
<p>The following examples set the default expression evaluator to MASM and then evaluate <i>Expression2</i> as a C++ expression, and evaluate <i>Expression1</i> and <i>Expression3</i> as MASM expressions.</p>
<div class="code"><span codelanguage=""><table>
<tr>
<th></th>
</tr>
<tr>
<td>
<pre>0:000&gt; .expr /s masm 
0:000&gt; bp Expression1 + @@( Expression2 ) + Expression3 </pre>
</td>
</tr>
</table></span></div>
<p>If <b>myInt</b> is a ULONG64 value and if you know that this value is followed in memory by another ULONG64, you can set an access breakpoint at that location by using one of the following examples. (Note the use of pointer arithmetic.)</p>
<div class="code"><span codelanguage=""><table>
<tr>
<th></th>
</tr>
<tr>
<td>
<pre>0:000&gt; ba r8 @@( &amp;myInt + 1 ) 
0:000&gt; ba r8 myInt + 8 </pre>
</td>
</tr>
</table></span></div>
<h3><a id="structures"></a><a id="STRUCTURES"></a>Structures</h3>
<p>The C++ expression evaluator casts pseudo-registers to their appropriate types. For example, <b>$teb</b> is cast as a TEB*. The following example displays the process ID.</p>
<div class="code"><span codelanguage=""><table>
<tr>
<th></th>
</tr>
<tr>
<td>
<pre>kd&gt; ??  @$teb-&gt;ClientId.UniqueProcess </pre></td></tr></table></span></div></div></div>	
	<div id="winchm_template_footer">Copyright &copy; 2019. All rights 
reserved. (To change the copyright info, just edit it in template.)</div>
</div>

</body>
</html>
